// 1.引入fs模块
const fs = require('fs')


// 2.调用readFile读取 考试成绩 内容
fs.readFile('./考试成绩.txt','utf-8',function(err,dataStr){
  
  // 3.失败就提示
  if(err){
    return console.log('读取文件失败！'+err.message);
  }
  
  // 3.读取成功则对数据进行处理

   // 3.1 根据空格将字符串分割成数组

   /**
    * (4) 看来基本上字符串还有数组的方法都是不改变原数组的，方便后面再使用
    *     split 以间隔符 将字符串转化成数组 真方便啊
    * */ 
   const buffer = dataStr.split(' ')
   console.log('替换前');
   console.log(buffer);

   // 3.2 循环将 = 替换成 ：
  //  for(let i=0;i<buffer.length;i++){
  //     /**
  //      * (1) forEach是只能遍历，不能赋值的循环，要赋值只能用for循环
  //      * (2) 字符串的replace(旧字符，新字符)只能替换一次，而且不改变原数组，和filter返回新数组
  //      * 想替换所有的话，需要正则表达式，第一个参数改为 /旧字符/g，表示全局的意思global
  //     */
  //     buffer[i] = buffer[i].replace('=',':')
  //  }

  /**
   * (5) 正好forEach里面的元素不能被赋值，只能给别人用
   *     然后又刚好一般数组/字符串的方法都是返回新的数组/字符串的
   *     这个体现了编码规则：数组/字符串尽量不在原数组/字符串上面操作，因为可能还要用
   *     同时也说明了forEach和这些方法有多搭配
   *     
   * */ 
  let newBuffer = []
  buffer.forEach((element)=>{
     newBuffer.push(element.replace('=',':'))
  })

   

   console.log('替换后：')
   console.log(buffer);

   

   // 3.3 再将数组拼接成字符串
   const result = newBuffer.join('\n')

   /**
    * (3) 嵌套写在循环里是因为 这里面是个回调函数，是异步的
    *     即就算把result定义在外面，在外面写入的话，不一定回调函数已经执行了
    * */ 
   fs.writeFile('./考试成绩-ok.txt',result,function(err){
       if(err){
          return console.log('文件写入失败!'+err.message);
       }
       console.log('文件写入成功!');
   })
})

